<?php

namespace Rjyst\RjCategoryModule\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Artisan;
use Rjyst\RjCategoryModule\Services\TableChecker;

class InstallCommand extends Command
{
    protected $signature = 'rj-category-module:install {--force : Force install without confirmation} {--skip-seed : Skip running seeders}';
    protected $description = 'Install RjYst Category Module Package';

    public function handle()
    {
        $this->info('🚀 开始安装 RjYst Category Module 扩展包...');

        // 1. 检查依赖扩展包
        if (!$this->checkDependencies()) {
            return;
        }

        // 2. 发布配置文件
        $this->publishConfig();

        // 3. 发布并检查迁移文件
        $this->publishMigrations();

        // 4. 发布模型文件
        $this->publishModels();

        // 5. 发布管理后台文件
        $this->publishAdminFiles();

        // 6. 发布 Seeders
        $this->publishSeeders();

        // 7. 添加路由
        $this->addRoute();

        // 8. 更新 Category 模型
        $this->updateCategoryModel();
        // 9. 自动执行 Seeders
        if (!$this->option('skip-seed')) {
            $this->runSeeders();
        }

        $this->info('🎉 RjYst Category Module 扩展包安装完成！');
        $this->showNextSteps();
    }
    protected function updateCategoryModel()
    {
        $this->info('更新 Category 模型...');

        $categoryModelPath = app_path('Models/Category/Category.php');

        if (!File::exists($categoryModelPath)) {
            $this->warn('⚠️  Category 模型不存在，请先安装年级管理扩展包');
            return;
        }

        $content = File::get($categoryModelPath);

        // 检查是否已经包含 CategoryModule 相关代码
        if (strpos($content, 'use App\Models\Category\CategoryModule;') !== false &&
            strpos($content, 'function category_module()') !== false) {
            $this->info('✅ Category 模型已包含 CategoryModule 关联');
            return;
        }

        // 1. 添加 use 语句（如果不存在）
        if (strpos($content, 'use App\Models\Category\CategoryModule;') === false) {
            $useStatement = 'use App\Models\Category\CategoryModule;';

            // 查找最后一个 use 语句的位置
            if (preg_match_all('/^use\s+[^;]+;$/m', $content, $matches, PREG_OFFSET_CAPTURE)) {
                $lastUseMatch = end($matches[0]);
                $lastUsePosition = $lastUseMatch[1] + strlen($lastUseMatch[0]);

                // 在最后一个 use 语句后添加新的 use 语句
                $content = substr_replace($content, "\n$useStatement", $lastUsePosition, 0);
            } else {
                // 如果没有找到 use 语句，在 namespace 后添加
                $content = preg_replace(
                    '/(namespace\s+[^;]+;)/',
                    "$1\n\n$useStatement",
                    $content
                );
            }
        }

        // 2. 检查是否已存在 category_module 方法
        if (strpos($content, 'function category_module()') === false) {
            // 添加关联方法
            $relationshipMethod = "
    public function category_module(): Relations\HasMany
    {
        return \$this->hasMany(CategoryModule::class, 'category_id');
    }";

            // 在类的末尾（最后一个大括号前）添加方法
            $lastBracePos = strrpos($content, '}');
            if ($lastBracePos !== false) {
                $content = substr_replace($content, $relationshipMethod . "\n}", $lastBracePos, 1);
            }
        }

        File::put($categoryModelPath, $content);
        $this->info('✅ Category 模型更新完成');
    }

    /**
     * 自动执行 Seeders
     */
    protected function runSeeders()
    {
        $this->info('🌱 开始执行数据填充...');

        // 执行菜单 Seeder
        $this->runSeeder('CategoryModuleMenuSeeder', '菜单数据');

        // 执行数据 Seeder
        $this->runSeeder('CategoryModuleSeeder', '分类模块数据');
    }

    /**
     * 执行单个 Seeder
     */
    protected function runSeeder($seederClass, $description)
    {
        try {
            $this->info("正在填充 {$description}...");

            $exitCode = Artisan::call('db:seed', [
                '--class' => $seederClass,
                '--force' => true
            ]);

            if ($exitCode === 0) {
                $this->info("✅ {$description}填充完成");

                // 显示 Artisan 命令的输出
                $output = Artisan::output();
                if ($output) {
                    $this->line($output);
                }
            } else {
                $this->warn("⚠️  {$description}填充可能有问题");
            }

        } catch (\Exception $e) {
            $this->error("❌ {$description}填充失败: " . $e->getMessage());

            // 如果是数据 Seeder 失败，提供手动执行的提示
            if ($seederClass === 'CategoryModuleSeeder') {
                $this->warn('💡 可能是因为缺少源数据连接，你可以稍后手动执行：');
                $this->line("php artisan db:seed --class={$seederClass}");
            }
        }
    }

    protected function checkDependencies()
    {
        $this->info('检查依赖扩展包...');

        $dependencies = [
            'App\Models\Category\Category' => [
                'name' => '意识听年级管理扩展包',
                'install_command' => 'php artisan category:install'
            ]
        ];

        $missingDependencies = [];

        foreach ($dependencies as $class => $info) {
            if (!class_exists($class)) {
                $this->error("❌ 缺少依赖: {$info['name']}");
                $this->line("请先运行: {$info['install_command']}");
                $missingDependencies[] = $info['name'];
            } else {
                $this->info("✅ 依赖检查通过: {$info['name']}");
            }
        }

        if (!empty($missingDependencies)) {
            $this->error('请先安装依赖扩展包后再继续！');
            return false;
        }

        return true;
    }

    protected function publishConfig()
    {
        $this->info('发布配置文件...');

        $this->call('vendor:publish', ['--tag' => 'rj-category-module-config', '--force' => $this->option('force')]);
        $this->info('✅ 配置文件发布完成');
    }

    protected function publishMigrations()
    {
        $this->info('发布迁移文件...');

        $this->call('vendor:publish', ['--tag' => 'rj-category-module-migrations']);

        // 检查表是否存在，不存在则运行迁移
        if (!Schema::hasTable('category_modules')) {
            $this->info('category_modules 表不存在，正在创建...');
            $this->runSpecificMigration('2025_09_09_011903_create_category_modules_table.php');
        } else {
            $this->info('✅ category_modules 表已存在');
        }
    }

    protected function runSpecificMigration($filename)
    {
        try {
            Artisan::call('migrate', ['--path' => 'database/migrations/' . $filename]);
            $this->info("✅ {$filename} 迁移完成");
        } catch (\Exception $e) {
            $this->error("迁移失败: " . $e->getMessage());
        }
    }

    protected function publishModels()
    {
        $this->info('发布模型文件...');

        $this->call('vendor:publish', ['--tag' => 'rj-category-module-models']);

        // 检查模型是否存在
        $categoryModuleModel = app_path('Models/Category/CategoryModule.php');

        if (File::exists($categoryModuleModel)) {
            $this->info('✅ CategoryModule 模型已存在，跳过');
        } else {
            $this->info('✅ CategoryModule 模型创建完成');
        }
    }

    protected function publishAdminFiles()
    {
        $this->info('发布管理后台文件...');

        // 发布控制器
        $this->call('vendor:publish', ['--tag' => 'rj-category-module-controllers']);

        // 发布仓库
        $this->call('vendor:publish', ['--tag' => 'rj-category-module-repositories']);

        // 检查管理后台文件是否存在
        $files = [
            'CategoryModuleController' => app_path('Admin/Controllers/Category/CategoryModuleController.php'),
            'CategoryModule Repository' => app_path('Admin/Repositories/Category/CategoryModule.php'),
        ];

        foreach ($files as $name => $path) {
            if (File::exists($path)) {
                $this->info("✅ {$name} 已存在，跳过");
            } else {
                $this->info("✅ {$name} 创建完成");
            }
        }
    }

    protected function publishSeeders()
    {
        $this->info('发布 Seeder 文件...');

        $this->call('vendor:publish', ['--tag' => 'rj-category-module-seeders']);

        $seeders = [
            'CategoryModuleSeeder.php' => database_path('seeders/CategoryModuleSeeder.php'),
            'CategoryModuleMenuSeeder.php' => database_path('seeders/CategoryModuleMenuSeeder.php'),
        ];

        foreach ($seeders as $name => $path) {
            if (File::exists($path)) {
                $this->info("✅ {$name} 已存在，跳过");
            } else {
                $this->info("✅ {$name} 创建完成");
            }
        }
    }

    protected function addRoute()
    {
        $this->info('添加路由...');

        $routeFile = app_path('Admin/routes.php');
        $routeLine = "    \$router->resource('category_module', 'Category\\CategoryModuleController');";

        if (!File::exists($routeFile)) {
            $this->warn('⚠️  Admin routes.php 文件不存在，请手动添加路由');
            return;
        }

        $content = File::get($routeFile);

        // 检查路由是否已存在
        if (strpos($content, "category_module") !== false) {
            $this->info('✅ 路由已存在');
            return;
        }

        // 查找 }); 的位置，在其前面添加路由
        $closingPattern = '});';
        $position = strrpos($content, $closingPattern);

        if ($position !== false) {
            // 在 }); 前面添加新路由
            $beforeClosing = substr($content, 0, $position);
            $afterClosing = substr($content, $position);

            // 确保有适当的换行
            $newContent = rtrim($beforeClosing) . "\n" . $routeLine . "\n" . $afterClosing;

            File::put($routeFile, $newContent);
            $this->info('✅ 路由添加完成');
        } else {
            $this->warn('⚠️  无法找到路由文件结构，请手动添加路由：');
            $this->line($routeLine);
        }
    }

    protected function showNextSteps()
    {
        $this->line('');
        $this->line('<fg=green>🎉 安装完成！功能已就绪：</>');
        $this->line('✅ 配置文件已发布');
        $this->line('✅ 数据表已创建');
        $this->line('✅ 模型文件已生成');
        $this->line('✅ Category 模型已更新（添加 category_module 关联）'); // 新增
        $this->line('✅ 管理后台已配置');
        $this->line('✅ 路由已添加');
        $this->line('✅ 菜单已创建');
        $this->line('✅ 数据已导入');
        $this->line('');
        $this->line('<fg=yellow>📋 可用功能：</>');
        $this->line('• 访问管理后台: 书籍管理 -> 书籍模块');
        $this->line('• 管理分类模块配置');
        $this->line('• 配置模块类型和开关状态');
        $this->line('• 管理教材版本和年级分类');
        $this->line('• Category 模型现在包含 category_module() 关联方法'); // 新增
        $this->line('');

        if ($this->option('skip-seed')) {
            $this->line('<fg=blue>🔧 手动执行数据填充：</>');
            $this->line('• 导入菜单: <fg=green>php artisan db:seed --class=CategoryModuleMenuSeeder</>');
            $this->line('• 导入数据: <fg=green>php artisan db:seed --class=CategoryModuleSeeder</>');
            $this->line('');
        } else {
            $this->line('<fg=blue>🔧 重新执行数据填充（如果需要）：</>');
            $this->line('• 重新导入菜单: <fg=green>php artisan db:seed --class=CategoryModuleMenuSeeder</>');
            $this->line('• 重新导入数据: <fg=green>php artisan db:seed --class=CategoryModuleSeeder</>');
            $this->line('');
        }

        $this->line('<fg=red>卸载：</>');
        $this->line('如需卸载扩展包，请运行: <fg=red>php artisan rj-category-module:uninstall</>');
    }

}
